import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'
// 状态
const state = {
  token: getToken(), // 设置token为共享状态 初始化vuex的时候 就先从缓存中读取
  userInfo: {} // 定义一个空对象 因为空对象的属性是undefined 数据为空的时候不会报错
}
// 修改状态
const mutations = {
  // mutations的setToken是vuex中修改state用的
  // auth的setToken是设置缓存中用的
  setToken(state, token) {
    // 1.修改vuex中的token
    state.token = token // 将数据设置给vuex
    // 2.同步给缓存中的token
    setToken(token)
  },
  removeToken(state) {
    state.token = null // 将vuex的数据置空
    removeToken() // 同步到缓存
  },
  // 设置用户信息
  setUserInfo(state, result) {
    // 更新一个对象
    state.userInfo = result
  },
  // 删除用户信息
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
// 执行异步
const actions = {
  // actions的login使用vuex用来发请求的
  // api的login是请求的接口返回的promise对象
  async login(context, data) { // data就是页面调用接口的时候传递的登录信息
    // 调用api接口 异步 修改state
    const result = await login(data)
    // result是axios包装类一层数据
    // result.data是后台真实返回的信息
    // result.data.data是后台返回的token
    // 如果为true 表示登录成功,才有token
    context.commit('setToken', result)
    // 只要登陆了，就要记录登录的时间戳
    setTimeStamp()
  },
  // 获取用户信息的action
  async getUserInfo(context) {
    // 调取获取用户信息的接口
    const result = await getUserInfo()
    // 调取获取用户基本信息的接口
    const baseInfo = await getUserDetailById(result.userId)
    context.commit('setUserInfo', { ...result, ...baseInfo }) // 合并数据
    return result // 埋个伏笔，用的时候再说
  },
  // 登出操作
  logout(context) {
    // 删除token
    context.commit('removeToken')
    // 删除用户信息
    context.commit('removeUserInfo')
    // 重置路由
    resetRouter()
    // 清空vuex的routes(子模块调用子模块的action)
    // user模块中的actions调用permission模块的mutations
    // 如果开启命名空间，这是在调用当前模块
    // 如果没有开启命名空间，调用的是任意模块
    // 全局访问子模块
    // this.$store.commit('permission/setRoutes', [])
    // 子模块模仿全局可以调用子模块
    context.commit('permission/setRoutes', [], { root: true })
    // 总结：如果多传一个参数{ root: true }，此时子模块就可以以全局模块的身份调用另一个子模块
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
